/**
 *   Copyright 2012-2019 Wicked Charts (http://github.com/adessoAG/wicked-charts)
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */
package de.adesso.wickedcharts.highcharts.options;

import java.io.Serializable;

/**
 * Defines a choice between on or more {@link PlotOptions}
 *
 * @author Tom Hombergs (tom.hombergs@gmail.com)
 * @see <a
 * href="http://api.highcharts.com/highcharts#plotOptions">http://api.highcharts.com/highcharts#plotOptions</a>
 */
public class PlotOptionsChoice implements Serializable {

    private static final long serialVersionUID = 1L;

    private PlotOptions area;

    private PlotOptions areaspline;

    private PlotOptions areasplinerange;

    private PlotOptions bar;

    private PlotOptions column;

    private PlotOptions line;

    private PlotOptions pie;

    private PlotOptions scatter;

    private PlotOptions series;

    private PlotOptions spline;

    private PlotOptions candleStick;

    private PlotOptions gauge;

    private PlotOptions columnrange;

    private PlotOptions boxplot;

    private PlotOptions bubble;

    public PlotOptionsChoice() {

    }

    public PlotOptions getArea() {
        return this.area;
    }

    public PlotOptions getAreaspline() {
        return this.areaspline;
    }

    public PlotOptions getAreasplinerange() {
        return this.areasplinerange;
    }

    public PlotOptions getBar() {
        return this.bar;
    }

    public PlotOptions getCandleStick() {
        return this.candleStick;
    }

    public PlotOptions getColumn() {
        return this.column;
    }

    public PlotOptions getLine() {
        return this.line;
    }

    public PlotOptions getPie() {
        return this.pie;
    }

    public PlotOptions getScatter() {
        return this.scatter;
    }

    public PlotOptions getSeries() {
        return this.series;
    }

    public PlotOptions getSpline() {
        return this.spline;
    }

    public PlotOptionsChoice setArea(final PlotOptions area) {
        this.area = area;
        return this;
    }

    public PlotOptionsChoice setAreaspline(final PlotOptions areaspline) {
        this.areaspline = areaspline;
        return this;
    }

    public PlotOptionsChoice setAreaSplineRange(final PlotOptions areasplinerange) {
        this.areasplinerange = areasplinerange;
        return this;
    }

    public PlotOptionsChoice setBar(final PlotOptions bar) {
        this.bar = bar;
        return this;
    }

    public PlotOptionsChoice setCandleStick(final PlotOptions candleStick) {
        this.candleStick = candleStick;
        return this;
    }

    public PlotOptionsChoice setColumn(final PlotOptions column) {
        this.column = column;
        return this;
    }

    public PlotOptionsChoice setLine(final PlotOptions line) {
        this.line = line;
        return this;
    }

    public PlotOptionsChoice setPie(final PlotOptions pie) {
        this.pie = pie;
        return this;
    }

    public PlotOptionsChoice setScatter(final PlotOptions scatter) {
        this.scatter = scatter;
        return this;
    }

    public PlotOptionsChoice setSeries(final PlotOptions series) {
        this.series = series;
        return this;
    }

    public PlotOptionsChoice setSpline(final PlotOptions spline) {
        this.spline = spline;
        return this;
    }

    public PlotOptionsChoice setColumnrange(PlotOptions columnrange) {
        this.columnrange = columnrange;
        return this;
    }

    public PlotOptions getColumnrange() {
        return columnrange;
    }

    public PlotOptionsChoice setGauge(PlotOptions gauge) {
        this.gauge = gauge;
        return this;
    }

    public PlotOptions getGauge() {
        return gauge;
    }

    public PlotOptions getPlotOptions(SeriesType type) {
        switch (type) {
            case AREA:
                return this.area;
            case AREASPLINE:
                return this.areaspline;
            case BAR:
                return this.bar;
            case COLUMN:
                return this.column;
            case LINE:
                return this.line;
            case PIE:
                return this.pie;
            case SCATTER:
                return this.scatter;
            case SPLINE:
                return this.spline;
            case COLUMNRANGE:
                return this.columnrange;
            case GAUGE:
                return this.gauge;
            default:
                throw new IllegalArgumentException("Invalid SeriesType: " + type);
        }
    }

    public PlotOptions getBoxplot() {
        return boxplot;
    }

    public PlotOptionsChoice setBoxplot(PlotOptions boxplot) {
        this.boxplot = boxplot;
        return this;
    }

    public PlotOptions getBubble() {
        return bubble;
    }

    public PlotOptionsChoice setBubble(PlotOptions bubble) {
        this.bubble = bubble;
	    return this;
    }

    public PlotOptionsChoice setPlotOptions(PlotOptions plotOptions, SeriesType type) {
        switch (type) {
            case AREA:
                this.area = plotOptions;
                break;
            case AREASPLINE:
                this.areaspline = plotOptions;
                break;
            case BAR:
                this.bar = plotOptions;
                break;
            case COLUMN:
                this.column = plotOptions;
                break;
            case LINE:
                this.line = plotOptions;
                break;
            case PIE:
                this.pie = plotOptions;
                break;
            case SCATTER:
                this.scatter = plotOptions;
                break;
            case SPLINE:
                this.spline = plotOptions;
                break;
            case COLUMNRANGE:
                this.columnrange = plotOptions;
                break;
            case GAUGE:
                this.gauge = plotOptions;
                break;
            case BUBBLE:
                this.bubble = plotOptions;
                break;
            case BOXPLOT:
                this.boxplot = plotOptions;
                break;
            default:
                throw new IllegalArgumentException("Invalid SeriesType: " + type);
        }
        return this;
    }

}
